package com.briup.smart.impl.server;

import com.briup.smart.env.entity.Environment;
import com.briup.smart.env.server.DBStore;
import com.briup.smart.impl.client.GatherImpl;
import com.briup.smart.impl.utils.JdbcUtils;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.Timestamp;
import java.util.Calendar;
import java.util.Collection;
import java.util.Date;

public class DbStoreImpl implements DBStore {
    @Override
    public void saveDB(Collection<Environment> collection) throws Exception {
        Connection conn = JdbcUtils.getDruidConnection();
        // 手动提交事务
        conn.setAutoCommit(false);
        PreparedStatement ps = null;
        int count = 0;

        // 记录当前数据的日期数
        int day = -1;
        // 准备一个变量，记录一下上一个的day的值
        int preDay = -1;

        // 遍历集合
        for (Environment environment : collection){
            // 根据时间里的天数去创建对应的sql语句
            Timestamp gatherDate = environment.getGatherDate();
            // 日历类 Calendar
            Calendar instance = Calendar.getInstance();
            instance.setTime(gatherDate);
            day = instance.get(Calendar.DAY_OF_MONTH);

            // 什么时候是新的ps 第一次循环，preday 不等于 day
            if(ps == null || preDay != day){
                if(ps != null){
                   // 代表不是第一次，意味着preDay和day不一样，上一次的ps要清空
                   ps.executeBatch();
                   ps.clearBatch();
                   conn.commit();
                   ps.close();
                }

                // 编辑sql语句（单表为例）
                String sql = "insert into e_detail_"+day +"(name,srcId,desId,devId,sersorAddress,count,cmd,status,data,gather_date) values(?,?,?,?,?,?,?,?,?,?)";
                // 使用jdbc
                ps = conn.prepareStatement(sql);
            }

            ps.setString(1, environment.getName());
            ps.setString(2, environment.getSrcId());
            ps.setString(3, environment.getDesId());
            ps.setString(4, environment.getDevId());
            ps.setString(5, environment.getSensorAddress());
            ps.setInt(6, environment.getCount());
            ps.setString(7, environment.getCmd());
            ps.setInt(8, environment.getStatus());
            ps.setFloat(9, environment.getData());
            ps.setTimestamp(10, environment.getGatherDate());
            // 使用批处理
            ps.addBatch();
            count++;
            // 执行完毕之后，将当前天赋予上一天
            preDay = day;
            // 什么时候提交？
            if(count % 2000 == 0){
                ps.executeBatch();
                ps.clearBatch();
                conn.commit();
            }
        }
        // 循环外面记得提交一下没有被2000整除的数据
        if(count % 2000 !=0){
            ps.executeBatch();
            ps.clearBatch();
            conn.commit();
        }
        System.out.println("本次入库结束，共入库"+collection.size()+"条数据");
    }
}
